home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 001-025 / scopedisk1 / files / memory.c < prev    next >
C/C++ Source or Header  |  1995-03-18  |  2KB  |  97 lines

  1.  
  2. /*
  3.  *  MEMORY.C
  4.  *
  5.  *  (c)Copyright 1987 Matthew Dillon, All Rights Reserved.
  6.  *
  7.  */
  8.  
  9. #include "files.h"
  10.  
  11. #define BLKSIZE     256     /*    # of records to allocate at once    */
  12. #define STRBLKSIZE  4096
  13. #define MAXSTRLEN   64        /*    maximum string len for cached strings    */
  14.  
  15. static RECORD *Freelist;
  16. static RECORD *Blk;
  17. static short  Bi;
  18. static char   *Strs[MAXSTRLEN];
  19. static char   *Sbuf;
  20. static short  Si;
  21.  
  22. RECORD *
  23. allocrecord()
  24. {
  25.     register RECORD *rec;
  26.     if (rec = Freelist) {
  27.     Freelist = Freelist->next;
  28.     return(rec);
  29.     }
  30.     if (!Bi) {
  31.     Blk = (RECORD *)malloc(sizeof(RECORD) * BLKSIZE);
  32.     if (!Blk)
  33.         return(NULL);
  34.     Bi = 256;
  35.     }
  36.     --Bi;
  37.     return(Blk++);
  38. }
  39.  
  40. void
  41. freerecord(rec)
  42. RECORD *rec;
  43. {
  44.     rec->next = Freelist;
  45.     Freelist = rec;
  46. }
  47.  
  48. char *
  49. allocstr(str)
  50. char *str;
  51. {
  52.     register short bytes = strlen(str) + 1;
  53.     register char *ptr;
  54.  
  55.     if (bytes >= 4 && bytes < MAXSTRLEN) {
  56.     if (Strs[bytes]) {
  57.         ptr = Strs[bytes];
  58.         Strs[bytes] = *(char **)ptr;
  59.     } else {
  60.         bytes = (bytes + 1) & ~1;
  61.         if (Si < bytes) {
  62.         Sbuf = malloc(STRBLKSIZE);
  63.         if (!Sbuf)
  64.             return(NULL);
  65.         Si = STRBLKSIZE;
  66.         }
  67.         ptr = Sbuf;
  68.         Sbuf += bytes;
  69.         Si -= bytes;
  70.     }
  71.     } else {
  72.     ptr = malloc(bytes);
  73.     if (!ptr)
  74.         return(NULL);
  75.     }
  76.     strcpy(ptr, str);
  77.     return(ptr);
  78. }
  79.  
  80. void
  81. freestr(ptr)
  82. char *ptr;
  83. {
  84.     register short len;
  85.  
  86.     if (ptr) {
  87.     len = strlen(ptr) + 1;
  88.     if (len >= 4 && len < MAXSTRLEN) {
  89.         *(char **)ptr = Strs[len];
  90.         Strs[len] = ptr;
  91.     } else {
  92.         free(ptr);
  93.     }
  94.     }
  95. }
  96.  
  97.